#ifndef LIVRO_H_
#define LIVRO_H_

#include <string>

using namespace std;

/**
 * @class Livro Livro.h "src/kisebo/Livro.h"
 * @brief Classe para controle dos livros. \n
 * Principal elemento do sistema.
*/
class Livro
{

private:

	/**
	* Código de identificação do livro.
	*/
	long id;

	/**
	* Titulo do livro.
	*/
	string titulo;

	/**
	* Autor do livro.
	*/
	string autor;

	/**
	* Tema de identificação do livro.
	*/
	string tema;

	/**
	* Preço R$ do livro.
	*/
	double valor;

	/**
	* Número da edição do livro.
	*/
	string edicao;

	/**
	* Ano de publicação do livro.
	*/
	int anoPublicacao;

	/**
	* Quantidade de páginas do livro.
	*/
	string paginas;

public:

	/**
	* @fn Livro()
	* @brief Construtor padrão
	* Construtor padrão do livro, utilizado para criar um livro. \n
	* Lembrando que quando construido o id do livro é -1.
	*/
	Livro();

	/**
	* @fn 	Livro(long _id, string _titulo, string _autor, string _tema,
	*	  double _valor, string _edicao, int _anoPublicacao, string _paginas)
	* @brief Construtor secundário
	* Construtor secundário onde devemos informar os parâmetros \n
	* para construção de um Livro preenchido.
	* @param _id Código de identificação
	* @param _titulo Titulo
	* @param _autor Autor
	* @param _tema Tema
	* @param _valor Preço do Livro R$
	* @param _edicao Edição
	* @param _anoPublicacao Ano de Publicação
	* @param _paginas Quantidade de páginas
	*/
	Livro(long _id, string _titulo, string _autor, string _tema,
		  double _valor, string _edicao, int _anoPublicacao, string _paginas);

	/**
	* @fn 	virtual ~Livro()
	* @brief Destrutor da classe.
	* Destrutor para liberar mémoria do programa.
	*/
	virtual ~Livro();

	/**
	* @fn void SetId(long _id)
	* @brief Insere o id.
	* @param _id id do livro.
	*/
	void SetId(long _id);

	/**
	* @fn long GetId()
	* @brief Obtem o id do livro.
	* @return O id do livro.
	*/
	long GetId();

	/**
	 * @fn void SetTitulo(string _titulo)
	 * @brief Insere o titulo no livro.
	 * @param _titulo titulo do livro.
	 */
	void SetTitulo(string _titulo);

	/**
	 * @fn string GetTitulo()
	 * brief Obtem o titulo do livro.
	 * @return O titulo do livro.
	 */
	string GetTitulo();

	/**
	 * @fn void SetAutor(string _autor)
	 * @brief Insere o autor do livro.
	 * @param _autor autor do livro.
	 */
	void SetAutor(string _autor);

	/**
	 * @fn string GetAutor()
	 * @brief Obtem o autor do livro.
	 * @return autor do livro.
	 */
    string GetAutor();

    /**
     * @fn void SetTema(string _tema)
     * @brief insere o tema do livro.
     * @param _tema tema do livro.
     */
    void SetTema(string _tema);

    /**
     * @fn string GetTema()
     * @brief Obtem o tema do livro.
     * @return tema.
     */
    string GetTema();

    /**
     * @fn void SetValor(double _valor)
     * @brief Insere o preço em reias do livro.
     * @param _valor preço R$.
     */
    void SetValor(double _valor);

    /**
     * @fn double GetValor()
     * @brief Obtem o preço.
     * @return preço em R$.
     */
    double GetValor();

    /**
     * @fn void SetEdicao(string _edicao)
     * @brief Insere a edição.
     * @param _edicao Edição.
     */
    void SetEdicao(string _edicao);

    /**
     * @fn string GetEdicao()
     * @brief Obtem a edição.
     * @return edição do livro.
     */
    string GetEdicao();

    /**
     * @fn void SetAnoPublicacao(int _anoPublicacao)
     * @brief Insere o Ano de Publicação.
     * @param _anoPublicacao Ano de Publicação.
     */
    void SetAnoPublicacao(int _anoPublicacao);

    /**
     * @fn int GetAnoPublicacao()
     * @brief Obtem o ano de publicação.
     * @return Ano de Publicação.
     */
    int GetAnoPublicacao();

    /**
     * @fn void SetPaginas(string _paginas)
     * @brief Insere a quantidade de páginas.
     * @param _paginas quantidade de páginas.
     */
    void SetPaginas(string _paginas);

    /**
     * @fn string GetPaginas()
     * @brief Obtem a quantidade de páginas.
     * @return a quantidade de páginas.
     */
    string GetPaginas();

    /**
     * @fn friend ostream& operator<<(ostream &_out, const Livro &_livro)
     * @brief método para a impressão do livro.
     * @param _out string de saida formatada.
     * @param _livro livro que deve ser impresso.
     * @return Retorna a impressão dos dados de um livro.
     */
    friend ostream& operator<<(ostream &_out, const Livro &_livro);

};

#endif /*LIVRO_H_*/
